package gc;

import java.io.IOException;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

/**
 * @author ZhengDp
 * @Date 2023/5/13 0:06
 * -Xmx20m
 * 打印垃圾回收的详细信息
 * -XX:+PrintGCDetails -verbose:gc
 */
public class SoftReference_Demo1 {

    private static final int _4MB = 4 * 1024 * 1024;

    // 不太重要的资源，在内存紧张时释放，下次使用时再加载
    public static void main(String[] args) throws IOException {
        //List<byte[]> list = new ArrayList<>();
        //for (int i = 0; i < 5; i++) {
        //    list.add(new byte[_4MB]);
        //}
        //System.in.read();
        soft();
    }

    public static void soft(){
        // list --> SoftReference --> byte[]
        List<SoftReference<byte[]>> list = new ArrayList<>();

        // 引用队列
        ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
        for (int i = 0; i < 5; i++) {
            // 关联引用队列，当软引用引用的对象被回收时，软引用自身对象就会被加入到引用队列queue中
            SoftReference<byte[]> ref = new SoftReference<>(new byte[_4MB],queue);
            System.out.println(ref.get());
            list.add(ref);
            System.out.println(list.size());
        }
        System.out.println("循环结束 ： " + list.size());
        Reference<? extends byte[]> poll = queue.poll();
        while (poll != null) {
            list.remove(poll);
            poll = queue.poll();
        }
        for(SoftReference<byte[]> ref : list) {
            System.out.println(ref.get());
        }
    }
}
